Įvaldykite Scikit-learn kryžminio patvirtinimo strategijas patikimam modelio pasirinkimui. Išnagrinėkite K-Fold, stratifikuotą, laiko eilučių CV su Python pavyzdžiais duomenų mokslininkams.
Scikit-learn įvaldymas: išsamus vadovas patikimoms kryžminio patvirtinimo strategijoms modelio pasirinkimui
Plačiame ir dinamiškame mašininio mokymosi kraštovaizdyje predikcinių modelių kūrimas yra tik pusė darbo. Kita, vienodai svarbi pusė – nuoseklus šių modelių vertinimas, siekiant užtikrinti, kad jie patikimai veiktų su nematytų duomenų. Be tinkamo vertinimo net ir sudėtingiausi algoritmai gali lemti klaidingas išvadas ir suboptimalius sprendimus. Šis iššūkis yra universalus, darantis įtaką duomenų mokslininkams ir mašininio mokymosi inžinieriams visose pramonės šakose ir geografinėse vietovėse.
Šis išsamus vadovas nagrinėja vieną iš pagrindinių ir galingiausių patikimo modelio vertinimo ir pasirinkimo metodų: kryžminį patvirtinimą, įdiegtą populiariojoje Python bibliotekoje „Scikit-learn“. Nesvarbu, ar esate patyręs profesionalas Londone, ar pradedantis duomenų analitikas Bengalūre, ar mašininio mokymosi tyrėjas San Paule, šių strategijų supratimas ir taikymas yra būtinas norint sukurti patikimas ir veiksmingas mašininio mokymosi sistemas.
Mes išnagrinėsime įvairias kryžminio patvirtinimo technikas, suprasime jų niuansus ir parodysime jų praktinį pritaikymą naudodami aiškų, vykdomąjį Python kodą. Mūsų tikslas yra suteikti jums žinių, kaip pasirinkti optimalią strategiją jūsų konkrečiam duomenų rinkiniui ir modeliavimo iššūkiui, užtikrinant, kad jūsų modeliai gerai apibendrintų ir užtikrintų pastovų našumą.
Perteklinio pritaikymo ir nepakankamo pritaikymo pavojus: kodėl svarbus patikimas vertinimas
Prieš pradedant nagrinėti kryžminį patvirtinimą, būtina suprasti du pagrindinius mašininio mokymosi priešus: perteklinį ir nepakankamą pritaikymą.
- Perteklinis pritaikymas: Tai įvyksta, kai modelis per gerai išmoksta mokymo duomenis, fiksuoja triukšmą ir specifinius šablonus, kurie neapibendrina naujų, nematytų duomenų. Perteklinio pritaikymo modelis puikiai veiks su mokymo rinkiniu, bet prastai su testavimo duomenimis. Įsivaizduokite studentą, kuris įsimena atsakymus konkrečiam egzaminui, bet sunkiai atsakinėja į šiek tiek skirtingus klausimus ta pačia tema.
- Nepakankamas pritaikymas: Priešingai, nepakankamas pritaikymas įvyksta, kai modelis yra per paprastas, kad užfiksuotų pagrindinius mokymo duomenų šablonus. Jis prastai veikia tiek su mokymo, tiek su testavimo duomenimis. Tai tarsi studentas, kuris nesuprato pagrindinių sąvokų ir todėl nesugeba atsakyti net į paprastus klausimus.
Tradicinis modelio vertinimas dažnai apima paprastą mokymo/testavimo padalijimą. Nors tai yra gera pradžia, vienas padalijimas gali būti problemiškas:
- Našumas gali labai priklausyti nuo konkretaus atsitiktinio padalijimo. „Sėkmingas“ padalijimas gali padaryti prastą modelį gerai atrodantį, ir atvirkščiai.
- Jei duomenų rinkinys yra mažas, vienas padalijimas reiškia mažiau duomenų mokymui arba mažiau duomenų testavimui, o tai gali lemti mažiau patikimus našumo įvertinimus.
- Jis nesuteikia stabilaus modelio našumo kintamumo įvertinimo.
Čia į pagalbą ateina kryžminis patvirtinimas, siūlantis patikimesnį ir statistiškai pagrįstesnį modelio našumo įvertinimo metodą.
Kas yra kryžminis patvirtinimas? Pagrindinė idėja
Kryžminio patvirtinimo esmė – tai pakartotinio imties sudarymo procedūra, naudojama mašininio mokymosi modeliams vertinti naudojant ribotą duomenų pavyzdį. Procedūra apima duomenų rinkinio padalijimą į papildomus poaibius, analizės atlikimą su vienu poaibiu (mokymo rinkiniu) ir analizės patvirtinimą su kitu poaibiu (testavimo rinkiniu). Šis procesas kartojamas daug kartų, keičiant poaibių vaidmenis, o rezultatai sujungiami, kad būtų gautas patikimesnis modelio našumo įvertinimas.
Pagrindiniai kryžminio patvirtinimo privalumai yra šie:
- Patikimesni našumo įvertinimai: Apskaičiuojant rezultatų vidurkį iš kelių mokymo-testavimo padalijimų, sumažėja našumo įvertinimo dispersija, todėl gaunamas stabilesnis ir tikslesnis modelio apibendrinimo matas.
- Geresnis duomenų panaudojimas: Visi duomenų taškai galiausiai naudojami tiek mokymui, tiek testavimui skirtinguose lankstuose, efektyviai panaudojant ribotus duomenų rinkinius.
- Perteklinio/nepakankamo pritaikymo aptikimas: Nuolatinis prastas našumas visuose lankstuose gali reikšti nepakankamą pritaikymą, o puikus mokymo našumas, bet prastas testavimo našumas visuose lankstuose rodo perteklinį pritaikymą.
Scikit-learn kryžminio patvirtinimo įrankių rinkinys
Scikit-learn, pagrindinė Python mašininio mokymosi biblioteka, teikia gausų įrankių rinkinį savo model_selection modulyje, skirtame įvairioms kryžminio patvirtinimo strategijoms įgyvendinti. Pradėkime nuo dažniausiai naudojamų funkcijų.
cross_val_score: trumpa modelio našumo apžvalga
Funkcija cross_val_score yra galbūt paprasčiausias būdas atlikti kryžminį patvirtinimą Scikit-learn. Ji įvertina balą kryžminiu patvirtinimu, grąžindama balų masyvą, po vieną kiekvienam lankstui.
Pagrindiniai parametrai:
estimator: Mašininio mokymosi modelio objektas (pvz.,LogisticRegression()).X: požymiai (mokymo duomenys).y: tikslinis kintamasis.cv: Nustato kryžminio patvirtinimo padalijimo strategiją. Gali būti sveikasis skaičius (lankstų skaičius), CV padalijimo objektas (pvz.,KFold()) arba iteruojamas objektas.scoring: eilutė (pvz., 'accuracy', 'f1', 'roc_auc') arba iškviečiamas objektas, skirtas įvertinti prognozes testavimo rinkinyje.
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
# Load a sample dataset
iris = load_iris()
X, y = iris.data, iris.target
# Initialize a model
model = LogisticRegression(max_iter=200)
# Perform 5-fold cross-validation
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f"Cross-validation scores: {scores}")
print(f"Mean accuracy: {scores.mean():.4f}")
print(f"Standard deviation of accuracy: {scores.std():.4f}")
Ši išvestis pateikia tikslumo balų masyvą, po vieną kiekvienam lankstui. Vidurkis ir standartinis nuokrypis suteikia modelio našumo centrinę tendenciją ir kintamumą.
cross_validate: išsamesnė metrika
Nors cross_val_score grąžina tik vieną metriką, cross_validate siūlo detalesnį valdymą ir grąžina metrikų žodyną, įskaitant mokymo balus, tinkamumo laikus ir balų laikus, kiekvienam lankstui. Tai ypač naudinga, kai reikia sekti kelias vertinimo metrikas arba našumo laikus.
from sklearn.model_selection import cross_validate
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target
model = LogisticRegression(max_iter=200)
# Perform 5-fold cross-validation with multiple scoring metrics
scoring = ['accuracy', 'precision_macro', 'recall_macro', 'f1_macro']
results = cross_validate(model, X, y, cv=5, scoring=scoring, return_train_score=True)
print("Cross-validation results:")
for metric_name, values in results.items():
print(f" {metric_name}: {values}")
print(f" Mean {metric_name}: {values.mean():.4f}")
print(f" Std {metric_name}: {values.std():.4f}")
Parametras return_train_score=True yra labai svarbus norint aptikti perteklinį pritaikymą: jei train_score yra žymiai didesnis nei test_score, jūsų modelis greičiausiai yra perteklinio pritaikymo.
Pagrindinės kryžminio patvirtinimo strategijos Scikit-learn
Scikit-learn siūlo kelis specializuotus kryžminio patvirtinimo iteratorius, kurių kiekvienas tinka skirtingoms duomenų charakteristikoms ir modeliavimo scenarijams. Tinkamos strategijos pasirinkimas yra labai svarbus norint gauti prasmingus ir nešališkus našumo įvertinimus.
1. K-kartų kryžminis patvirtinimas
Aprašymas: K-kartų yra dažniausiai naudojama kryžminio patvirtinimo strategija. Duomenų rinkinys padalijamas į k vienodo dydžio dalis (folds). Kiekvienoje iteracijoje viena dalis naudojama kaip testavimo rinkinys, o likusios k-1 dalys – kaip mokymo rinkinys. Šis procesas kartojamas k kartų, kiekviena dalis panaudojama kaip testavimo rinkinys lygiai vieną kartą.
Kada naudoti: Tai universalus pasirinkimas, tinkantis daugeliui standartinių klasifikavimo ir regresijos užduočių, kai duomenų taškai yra nepriklausomi ir identiškai paskirstyti (i.i.d.).
Aspektai:
- Paprastai
knustatomas į 5 arba 10. Didesnisklemia mažiau šališkus, bet skaičiavimo atžvilgiu brangesnius įvertinimus. - Gali būti problemiška nesubalansuotiems duomenų rinkiniams, nes kai kuriuose lankstuose gali būti labai mažai arba visai nebūti mažumos klasės pavyzdžių.
from sklearn.model_selection import KFold
import numpy as np
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 1, 0, 1, 0, 1])
kf = KFold(n_splits=3, shuffle=True, random_state=42)
print("K-Fold Cross-validation splits:")
for i, (train_index, test_index) in enumerate(kf.split(X)):
print(f" Fold {i+1}:")
print(f" TRAIN: {train_index}, TEST: {test_index}")
print(f" Train data X: {X[train_index]}, y: {y[train_index]}")
print(f" Test data X: {X[test_index]}, y: {y[test_index]}")
Parametras shuffle=True yra svarbus duomenims atsitiktinai išdėstyti prieš padalijant, ypač jei jūsų duomenys turi natūralią tvarką. random_state užtikrina atsitiktinio išdėstymo atkuriamumą.
2. Stratifikuotas K-kartų kryžminis patvirtinimas
Aprašymas: Tai yra K-kartų variacija, specialiai sukurta klasifikavimo užduotims, ypač su nesubalansuotais duomenų rinkiniais. Ji užtikrina, kad kiekviena dalis (fold) turėtų apytiksliai tokį patį procentą kiekvienos tikslinės klasės pavyzdžių, kaip ir visas rinkinys. Tai apsaugo dalis nuo visiško mažumos klasės pavyzdžių trūkumo, o tai lemtų prastą modelio mokymą ar testavimą.
Kada naudoti: Būtina klasifikavimo problemoms, ypač kai susiduriama su nesubalansuotu klasių pasiskirstymu, dažnu medicininėje diagnostikoje (pvz., retų ligų aptikimas), sukčiavimo aptikimu ar anomalijų aptikimu.
from sklearn.model_selection import StratifiedKFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4], [5,6], [7,8], [9,10], [11,12]])
y_imbalanced = np.array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1]) # 60% class 0, 40% class 1
skf = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
print("Stratified K-Fold Cross-validation splits:")
for i, (train_index, test_index) in enumerate(skf.split(X, y_imbalanced)):
print(f" Fold {i+1}:")
print(f" TRAIN: {train_index}, TEST: {test_index}")
print(f" Train y distribution: {np.bincount(y_imbalanced[train_index])}")
print(f" Test y distribution: {np.bincount(y_imbalanced[test_index])}")
Atkreipkite dėmesį, kaip np.bincount rodo, kad tiek mokymo, tiek testavimo rinkiniai kiekvienoje dalyje išlaiko panašią klasių proporciją (pvz., 60/40 padalijimą arba kuo artimesnį, atsižvelgiant į n_splits).
3. Palikite-vieną-iš-kryžminis patvirtinimas (LOOCV)
Aprašymas: LOOCV yra kraštutinis K-kartų atvejis, kai k yra lygus pavyzdžių skaičiui (n). Kiekvienai daliai vienas pavyzdys naudojamas kaip testavimo rinkinys, o likę n-1 pavyzdžiai – mokymui. Tai reiškia, kad modelis yra mokomas ir vertinamas n kartų.
Kada naudoti:
- Tinka labai mažiems duomenų rinkiniams, kur yra labai svarbu maksimaliai padidinti mokymo duomenų kiekį kiekvienai iteracijai.
- Pateikia beveik nešališką modelio našumo įvertinimą.
Aspektai:
- Ypatingai brangu skaičiavimo atžvilgiu dideliems duomenų rinkiniams, nes reikia apmokyti modelį
nkartų. - Didelė našumo įvertinimų dispersija tarp iteracijų, nes testavimo rinkinys yra labai mažas.
from sklearn.model_selection import LeaveOneOut
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])
y = np.array([0, 1, 0, 1])
loo = LeaveOneOut()
print("Leave-One-Out Cross-validation splits:")
for i, (train_index, test_index) in enumerate(loo.split(X)):
print(f" Iteration {i+1}: TRAIN: {train_index}, TEST: {test_index}")
4. Atsitiktinis padalijimas (ShuffleSplit) ir Stratifikuotas atsitiktinis padalijimas (StratifiedShuffleSplit)
Aprašymas: Skirtingai nei K-kartų metodas, kuris garantuoja, kad kiekvienas pavyzdys testavimo rinkinyje pasirodo lygiai vieną kartą, ShuffleSplit sudaro n_splits atsitiktinių mokymo/testavimo padalijimų. Kiekvienam padalijimui tam tikra duomenų dalis atsitiktinai pasirenkama mokymui, o kita (nesusijusi) dalis – testavimui. Tai leidžia atlikti pakartotinį atsitiktinį atrinkimą.
Kada naudoti:
- Kai K-kartų metode (
k) dalių skaičius yra ribotas, bet vis tiek norite atlikti kelis nepriklausomus padalijimus. - Naudingas didesniems duomenų rinkiniams, kur K-kartų metodas gali būti intensyvus skaičiavimo atžvilgiu, arba kai norite daugiau kontrolės virš testavimo rinkinio dydžio, nei tiesiog
1/k. StratifiedShuffleSplityra tinkamesnis pasirinkimas klasifikavimui su nesubalansuotais duomenimis, nes jis išlaiko klasių pasiskirstymą kiekviename padalijime.
Aspektai: Ne visi pavyzdžiai garantuotai atsidurs testavimo ar mokymo rinkinyje bent viename padalijime, nors esant dideliam padalijimų skaičiui, tai tampa mažiau tikėtina.
from sklearn.model_selection import ShuffleSplit, StratifiedShuffleSplit
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4], [5,6], [7,8], [9,10], [11,12]])
y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) # Imbalanced data for StratifiedShuffleSplit
# ShuffleSplit example
ss = ShuffleSplit(n_splits=5, test_size=0.3, random_state=42)
print("ShuffleSplit Cross-validation splits:")
for i, (train_index, test_index) in enumerate(ss.split(X)):
print(f" Split {i+1}: TRAIN: {train_index}, TEST: {test_index}")
# StratifiedShuffleSplit example
sss = StratifiedShuffleSplit(n_splits=5, test_size=0.3, random_state=42)
print("\nStratifiedShuffleSplit Cross-validation splits (y distribution maintained):")
for i, (train_index, test_index) in enumerate(sss.split(X, y)):
print(f" Split {i+1}:")
print(f" TRAIN: {train_index}, TEST: {test_index}")
print(f" Train y distribution: {np.bincount(y[train_index])}")
print(f" Test y distribution: {np.bincount(y[test_index])}")
5. Laiko eilučių kryžminis patvirtinimas (TimeSeriesSplit)
Aprašymas: Standartiniai kryžminio patvirtinimo metodai daro prielaidą, kad duomenų taškai yra nepriklausomi. Tačiau laiko eilučių duomenyse stebėjimai yra užsakyti ir dažnai pasižymi laiko priklausomybėmis. Duomenų maišymas arba atsitiktinis laiko eilučių duomenų padalijimas sukeltų duomenų nutekėjimą, kai modelis treniruojasi su ateities duomenimis, kad prognozuotų praeities duomenis, o tai lemtų pernelyg optimistišką ir nerealią našumo prognozę.
TimeSeriesSplit sprendžia šią problemą pateikdama mokymo/testavimo padalijimus, kai testavimo rinkinys visada eina po mokymo rinkinio. Jis veikia padalijant duomenis į mokymo rinkinį ir vėlesnį testavimo rinkinį, tada palaipsniui plečiant mokymo rinkinį ir slenkant testavimo rinkinį į priekį laike.
Kada naudoti: Išskirtinai laiko eilučių prognozavimui ar bet kokiems sekos duomenims, kuriuose turi būti išsaugota stebėjimų chronologinė tvarka.
Aspektai: Mokymo rinkiniai didėja su kiekvienu padalijimu, o tai gali lemti įvairų našumą, o pradiniai mokymo rinkiniai gali būti gana maži.
from sklearn.model_selection import TimeSeriesSplit
import pandas as pd
# Simulate time series data
dates = pd.to_datetime(pd.date_range(start='2023-01-01', periods=100, freq='D'))
X_ts = np.arange(100).reshape(-1, 1)
y_ts = np.sin(np.arange(100) / 10) + np.random.randn(100) * 0.1 # Some time-dependent target
tscv = TimeSeriesSplit(n_splits=5)
print("Time Series Cross-validation splits:")
for i, (train_index, test_index) in enumerate(tscv.split(X_ts)):
print(f" Fold {i+1}:")
print(f" TRAIN indices: {train_index[0]} to {train_index[-1]}")
print(f" TEST indices: {test_index[0]} to {test_index[-1]}")
# Verify that test_index always starts after train_index ends
assert train_index[-1] < test_index[0]
Šis metodas užtikrina, kad jūsų modelis visada būtų vertinamas su ateities duomenimis, palyginti su tuo, kuo jis buvo apmokytas, imituojant realaus pasaulio diegimo scenarijus laiko priklausomoms problemoms.
6. Grupinis kryžminis patvirtinimas (GroupKFold, LeaveOneGroupOut)
Aprašymas: Kai kuriuose duomenų rinkiniuose pavyzdžiai nėra visiškai nepriklausomi; jie gali priklausyti konkrečioms grupėms. Pavyzdžiui, keli medicininiai matavimai iš to paties paciento, keli stebėjimai iš to paties jutiklio arba kelios finansinės operacijos iš to paties kliento. Jei šios grupės yra padalintos tarp mokymo ir testavimo rinkinių, modelis gali išmokti grupėms būdingus šablonus ir nesugebėti apibendrinti naujų, nematytų grupių. Tai yra duomenų nutekėjimo forma.
Grupinio kryžminio patvirtinimo strategijos užtikrina, kad visi duomenų taškai iš vienos grupės atsidurtų arba tik mokymo rinkinyje, arba tik testavimo rinkinyje, bet niekada abiejuose.
Kada naudoti: Visada, kai jūsų duomenyse yra įgimtų grupių, kurios gali sukelti šališkumą, jei bus padalintos tarp dalių (folds), pavyzdžiui, ilgalaikiai tyrimai, jutiklių duomenys iš kelių įrenginių arba kliento elgesio modeliavimas.
Aspektai: Reikia perduoti „groups“ masyvą į .split() metodą, nurodant kiekvieno pavyzdžio grupės tapatybę.
from sklearn.model_selection import GroupKFold
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10], [11, 12], [13, 14], [15, 16]])
y = np.array([0, 1, 0, 1, 0, 1, 0, 1])
# Two groups: samples 0-3 belong to Group A, samples 4-7 belong to Group B
groups = np.array(['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'])
gkf = GroupKFold(n_splits=2) # We'll use 2 splits to clearly separate groups
print("Group K-Fold Cross-validation splits:")
for i, (train_index, test_index) in enumerate(gkf.split(X, y, groups)):
print(f" Fold {i+1}:")
print(f" TRAIN indices: {train_index}, GROUPS: {groups[train_index]}")
print(f" TEST indices: {test_index}, GROUPS: {groups[test_index]}")
# Verify that no group appears in both train and test sets for a single fold
assert len(set(groups[train_index]).intersection(set(groups[test_index]))) == 0
Kitos grupės atžvilgiu informuotos strategijos apima LeaveOneGroupOut (kiekviena unikali grupė vieną kartą sudaro testavimo rinkinį) ir LeavePGroupsOut (palieka P grupių testavimo rinkiniui).
Išplėstinis modelio pasirinkimas su kryžminiu patvirtinimu
Kryžminis patvirtinimas skirtas ne tik vieno modelio vertinimui; jis taip pat yra neatsiejama geriausio modelio pasirinkimo ir jo hiperparametrų derinimo dalis.
Hiperparametrų derinimas su GridSearchCV ir RandomizedSearchCV
Mašininio mokymosi modeliai dažnai turi hiperparametrus, kurie nėra išmokstami iš duomenų, bet turi būti nustatyti prieš apmokymą. Optimalios šių hiperparametrų reikšmės paprastai priklauso nuo duomenų rinkinio. Scikit-learn GridSearchCV ir RandomizedSearchCV naudoja kryžminį patvirtinimą, kad sistemingai ieškotų geriausio hiperparametrų derinio.
GridSearchCV: Išsamiai ieško per nurodytą parametrų tinklelį, vertindamas kiekvieną įmanomą derinį naudodamas kryžminį patvirtinimą. Jis garantuoja geriausio derinio radimą tinklelyje, tačiau gali būti brangus skaičiavimo atžvilgiu dideliems tinkleliams.RandomizedSearchCV: Renka fiksuotą skaičių parametrų nustatymų iš nurodytų pasiskirstymų. Jis yra efektyvesnis užGridSearchCVdidelėms paieškos erdvėms, nes nebando kiekvieno derinio, dažnai randant gerą sprendimą per trumpesnį laiką.
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
# Load a sample dataset
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target
# Define the model and parameter grid
model = SVC()
param_grid = {
'C': [0.1, 1, 10],
'kernel': ['linear', 'rbf']
}
# Perform GridSearchCV with 5-fold cross-validation
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=5, scoring='accuracy', n_jobs=-1)
grid_search.fit(X, y)
print(f"Best parameters: {grid_search.best_params_}")
print(f"Best cross-validation accuracy: {grid_search.best_score_:.4f}")
Tiek GridSearchCV, tiek RandomizedSearchCV priima cv parametrą, leidžiantį nurodyti bet kurį anksčiau aptartą kryžminio patvirtinimo iteratorių (pvz., StratifiedKFold nesubalansuotoms klasifikavimo užduotims).
Įdėtasis kryžminis patvirtinimas: Pernelyg optimistiškų įvertinimų prevencija
Kai naudojate kryžminį patvirtinimą hiperparametrų derinimui (pvz., su GridSearchCV) ir vėliau naudojate rastus geriausius parametrus modeliui įvertinti išoriniame testavimo rinkinyje, vis tiek galite gauti pernelyg optimistinį savo modelio našumo įvertinimą. Taip yra todėl, kad pats hiperparametrų pasirinkimas įveda tam tikrą duomenų nutekėjimą: hiperparametrai buvo optimizuoti remiantis visais mokymo duomenimis (įskaitant vidinės kilpos patvirtinimo dalis), todėl modelis šiek tiek „žinojo“ apie testavimo rinkinio charakteristikas.
Įdėtasis kryžminis patvirtinimas yra griežtesnis metodas, kuris tai sprendžia. Jis apima du kryžminio patvirtinimo sluoksnius:
- Išorinė kilpa: Padalija duomenų rinkinį į K dalis bendram modelio vertinimui.
- Vidinė kilpa: Kiekvienai išorinės kilpos mokymo daliai atlieka dar vieną kryžminio patvirtinimo etapą (pvz., naudojant
GridSearchCV), kad rastų geriausius hiperparametrus. Tada modelis apmokomas su šia išorine mokymo dalimi, naudojant šiuos optimalius hiperparametrus. - Vertinimas: Apdorotas modelis (su geriausiais vidinės kilpos hiperparametrais) tada įvertinamas su atitinkama išorine testavimo dalimi.
Tokiu būdu hiperparametrai optimizuojami nepriklausomai kiekvienai išorinei daliai, suteikiant tikrai nešališką modelio apibendrinimo našumo įvertinimą su nematytų duomenų. Nors yra intensyvesnis skaičiavimo atžvilgiu, įdėtasis kryžminis patvirtinimas yra aukščiausias standartas patikimam modelio pasirinkimui, kai reikia derinti hiperparametrus.
Geriausia praktika ir aspektai pasaulinei auditorijai
Efektyvus kryžminio patvirtinimo taikymas reikalauja apgalvoto požiūrio, ypač dirbant su įvairiais duomenų rinkiniais iš skirtingų pasaulinių kontekstų.
- Pasirinkite tinkamą strategiją: Visada atsižvelkite į įgimtas savo duomenų savybes. Ar jie priklausomi nuo laiko? Ar turi sugrupuotus stebėjimus? Ar klasių žymės nesubalansuotos? Tai bene pats svarbiausias sprendimas. Neteisingas pasirinkimas (pvz., K-kartų metodas laiko eilutėms) gali lemti neteisingus rezultatus, nepriklausomai nuo jūsų geografinės padėties ar duomenų kilmės.
- Duomenų rinkinio dydis ir skaičiavimo kaina: Didesniems duomenų rinkiniams dažnai reikia mažiau dalių (pvz., 5-ių vietoj 10-ies dalių arba LOOCV) arba metodų, tokių kaip
ShuffleSplit, siekiant valdyti skaičiavimo resursus. Paskirstytosios kompiuterių platformos ir debesų paslaugos (pvz., AWS, Azure, Google Cloud) yra prieinamos visame pasaulyje ir gali padėti atliekant intensyvias kryžminio patvirtinimo užduotis. - Atkuriamumas: Visada nustatykite
random_statesavo kryžminio patvirtinimo dalikliuose (pvz.,KFold(..., random_state=42)). Tai užtikrina, kad jūsų rezultatus galės atkurti kiti, skatinant skaidrumą ir bendradarbiavimą tarp tarptautinių komandų. - Rezultatų interpretavimas: Žiūrėkite ne tik į vidutinį balą. Kryžminio patvirtinimo balų standartinis nuokrypis rodo jūsų modelio našumo kintamumą. Didelis standartinis nuokrypis gali reikšti, kad jūsų modelio našumas yra jautrus konkretiems duomenų padalijimams, o tai gali kelti susirūpinimą.
- Domeno žinios yra karalius: Duomenų kilmės ir charakteristikų supratimas yra svarbiausias. Pavyzdžiui, žinojimas, kad klientų duomenys gaunami iš skirtingų geografinių regionų, gali reikšti, kad reikia naudoti grupėmis pagrįstą kryžminį patvirtinimą, jei regioniniai modeliai yra stiprūs. Pasaulinis bendradarbiavimas duomenų supratimo srityje čia yra pagrindinis.
- Etiniai aspektai ir šališkumas: Net ir esant tobulam kryžminiam patvirtinimui, jei jūsų pradiniuose duomenyse yra šališkumo (pvz., tam tikrų demografinių grupių ar regionų nepakankamas atstovavimas), jūsų modelis greičiausiai išlaikys tuos šališkumus. Kryžminis patvirtinimas padeda įvertinti apibendrinimą, bet nepataiso įgimtų duomenų šališkumų. Jų sprendimui reikia kruopštaus duomenų rinkimo ir išankstinio apdorojimo, dažnai pasitelkiant įvairias kultūrines ir socialines perspektyvas.
- Mastelis: Itin dideliems duomenų rinkiniams visas kryžminis patvirtinimas gali būti neįmanomas. Apsvarstykite tokius metodus kaip atrinkimas pradiniam modelio kūrimui arba specializuotų paskirstytojo mašininio mokymosi sistemų, kurios efektyviai integruoja kryžminį patvirtinimą, naudojimą.
Išvada
Kryžminis patvirtinimas yra ne tik technika; tai yra pagrindinis principas kuriant patikimus ir patikimus mašininio mokymosi modelius. Scikit-learn teikia platų ir lankstų įrankių rinkinį įvairioms kryžminio patvirtinimo strategijoms įgyvendinti, leidžiant duomenų mokslininkams visame pasaulyje griežtai įvertinti savo modelius ir priimti pagrįstus sprendimus.
Supratę skirtumus tarp K-Fold, Stratifikuoto K-Fold, Laiko eilučių padalijimo, GroupKFold ir šių technikų kritinę svarbą hiperparametrų derinimui ir patikimam vertinimui, esate geriau pasirengę susidoroti su modelio pasirinkimo sudėtingumu. Visada derinkite savo kryžminio patvirtinimo strategiją su unikaliomis duomenų charakteristikomis ir konkrečiais mašininio mokymosi projekto tikslais.
Prasidėkite nuo šių strategijų, kad pereitumėte nuo paprastos prognozės prie modelių, kurie yra tikrai apibendrinami, patikimi ir veiksmingi bet kuriame pasauliniame kontekste. Jūsų kelionė į modelio pasirinkimo įvaldymą su Scikit-learn tik prasidėjo!